
/*
*Released on 28th June 2008.
*Any violations can be reported at paritosh@wikiocean.net
*What is treated as violations can be found at www.wikiocean.net/ppl1-voilations*
******************************************************************************
* The contents of this file are subject to POOL Public License 1.0 and later.
* POOL Public License is based on Affero GPL v3 and additional conditions.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the Affero GPL v3 License at http://www.gnu.org/licenses/agpl.html
* You may obtain a copy of the POOL Public License 1.0 or later at www.wikiocean.net/license/ppl.html
* Software distributed under POOL Public License 1.0 is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya (C) 2008. All Rights Reserved.
******************************************************************************
* Objective of the additional terms (license)
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencies.
* 3) To avoid a situation where big corporate or investor can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the freedom is curtailed in companies that get Venture Capital funding.)
******************************************************************************
*/

package  guifilegenerator;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
/**
 * This class finds level of each tag object in text file.
 * 
 */
public class LevelFinder 
{    
    private File f;
    private RandomAccessFile raf;
    private String FileName=null;
    private HashMap<Object,LinkedList<Object>> LevelAndLinenum= new HashMap<Object,LinkedList<Object>>();        
    private  char  Specialchar; 
    /**
     * The constructor accepts text file name and special character separating Objects 
     * and properties 
     * @param filename File name of text file to be searched
     * @param specialchar Special character 
     */
    public LevelFinder(String filename,char specialchar)             
    {
    	this.FileName= filename;
    	this.f= new File(filename);
    	try 
    	{
           this.raf= new RandomAccessFile(FileName,"r");
    	} 
    	catch(Exception e) 
    	{
    	   e.printStackTrace(); 
    	}
    	this.Specialchar=specialchar;	     
    }
       
    /**
     * The method finds level of each tag object from text file.
     * @return It returns a hashtable containing line of text file and its level i.e.
     * no of preceeding special characters 
     */
    public HashMap<Object,LinkedList<Object>> LineLevelFinder()
    {
	   StringBuffer objbuf = new StringBuffer();
	   String line= null;                   
	   HashMap<Object,LinkedList<Object>> levelLine= new HashMap<Object,LinkedList<Object>>(); 
	   
	   try
	   {     
		   raf.seek(0);
		   int LineNum=0;
		   raf.readLine();
		   
		   while((line=raf.readLine())!=null)
		   {                
                Iterator it=null;    
                char[] chararry =line.toCharArray();
                int Level=0;
                
                while(chararry[Level]==Specialchar)
                {
                     Level++;
                }
                    LineNum++;

                    line = line.substring(Level);
               if(levelLine.isEmpty())
                {
                      LinkedList<Object> ll= new LinkedList<Object>();
                      ll.add(line); 
                      levelLine.put(Level,ll);
                      it =levelLine.keySet().iterator();
                      it.next();
                }

                if(it==null)
                {
                      it =levelLine.keySet().iterator();
                }

                boolean Flag=false;

                while(it.hasNext())
                {
                      Integer i=(Integer)it.next();
                       if(Integer.parseInt(i.toString())==Level)
                          {
                                Integer keyName =Level;
                                levelLine.get(keyName).add(line);                                        
                                Flag=true;
                                break;
                          }
                }
                if(Flag==false)
                {
                     LinkedList<Object> ll= new LinkedList<Object>();
                      ll.add(line); 
                      levelLine.put(Level,ll);                                          
                 }                                                                                     
		   } 
	   }
       catch(Exception e)           
       {
          e.printStackTrace();    
       }                     
         this.LevelAndLinenum = levelLine;                  
         return levelLine;                     
    }  
                


 // Before call to  getLevelWithObjectName find  call [Linelevelfinder] this will give u hash table with<Object:Level,LinkedList<Object:Lines>> from that u will get the  objects ;
 // if arugument passed is not an  Object Name IT will return -1 ;
    /**
     * This method finds integer level means no of preceding special characters 
     * before the object.
     * @return It returns level of objectname.
     */
    public int getLevel(String objectName)
    {
     HashMap<Object,LinkedList<Object>> mapforLevl= new HashMap<Object,LinkedList<Object>>();
     mapforLevl= this.LevelAndLinenum;                         
     int MaxLevel= mapforLevl.size();
     Iterator keyLevels = mapforLevl.keySet().iterator();
     boolean Objectfound=false;
     int ObjectLevel=-1;
     
     while(keyLevels.hasNext()&& !Objectfound)
     {
         Object key = keyLevels.next();
                 
         LinkedList<Object> Llines=mapforLevl.get(key);
         for(int i=0;i<Llines.size();i++)
         {                       
	          String line =Llines.get(i).toString();
	          String saa []=line.split(String.valueOf(Specialchar));
	          if(saa[1].equalsIgnoreCase(objectName)&&saa[0].equalsIgnoreCase("object"))
	          {
	            ObjectLevel=Integer.parseInt(key.toString());
	            Objectfound =true; 
	            break;   
	          }   
             
          }

     }

     return ObjectLevel;                                 
  }                    
                     
}